קבוצה ייצוגית של מפתחים העונה לשם PHP Framework Interoperability Group עבדה בחודשים האחרונים על מסמכי סטנדרטים לכתיבת קוד PHP.
PSR-0 עוסק בנתינת שמות נכונים לניימספייסים (Namespaces) ובחלוקה נכונה של קבצים בתיקיות.
מי צריך סטנדרטים
בתחילת הקריירה שלי חשבתי שלא צריך סטנדרטים לכתיבת קוד; שכל אחד יכתוב איך שנוח לו, העיקר שיעבוד. חשבתי שכתבתי קוד ברור, קריא ומסודר, למרות שבטח הוא לא היה קריא יותר מזה. ככה זה נמשך עד הרגע שבו גיליתי שאני לא המפתח היחיד בכדור הארץ. באותו זמן, מפתחים אחרים התחילו להתפלג לשתי קטגוריות – מפתחים שלא ידעו איפה כפתור הרווח והטאב במקלדת ומפתחים שתכנתו בפוטושופ.
למזלי, השותף הראשון שלי היה שייך לקטגוריה השנייה, והתחלנו לעבוד ביחד. אני כתבתי בקוד GetName, והוא כתב get_email; אני שמתי את הקבצים בתיקייה users, והוא שם בתיקייה data/messages; אני כתבתי <?php echo והוא כתב <?=. כמות הזמן שבילינו בחיפוש אופן הכתיבה של האחר חסכה לנו הרבה כסף על בירה, שהיינו יכולים לשתות באותו זמן מבוזבז.
PSR-0
PSR-0 הוא סטנדרט העוסק בשמות נכונים לניימספייסים (Namespaces) ובמבנה התיקיות בפרויקט.
היום כמעט כל פרויקט לא בנוי רק מקוד שכתבנו בעצמנו, אלא גם מקוד שמישהו אחר כתב, ממודול אחר, מפרויקט אחר בחברה או אפילו מחברה אחרת. הסטנדרט לשמות הניימספייסים שנקבע בקבוצת ה-FIG הוא כזה:
1. שם הניימספייס חייב להיות רשום בצורה הבאה:
\<Vendor Name>\(<Namespace>\)*<Class Name>
לכל ניימספייס יש שלושה חלקים: שם הארגון שמפתח אותו, שם הניימספייס עצמו ושם המחלקה בסופו.
2. כל ניימספייס חייב להיות שייך לניימספייס אב שהוא שם הארגון.
די פשוט – כל ניימספייס חייב להתחיל משם הארגון. (שם האתר, אם אין ארגון.)
3. כל ניימספייס יכול להכיל כמות בלתי מוגבלת של תתי ניימספייסים.
כלומר גם \phpguide\module1\submodule2\subsub3\MyClass זה בסדר גמור.
4. ההפרדה בין ניימספייסים מתורגמת להפרדת תיקיות.
לדעתי, זה הכלל הכי חשוב בסטנדרט הזה. היררכיית הניימספייסים תואמת להיררכיית הקבצים והתיקיות. עבור \phpguide\module1\submodule2\subsub3\MyClass תהיה תיקייה של phpguide שבתוכה תהיה תיקייה module1 ובה תיקייה submodule2 ובה תיקייה subsub3.
5. כל תו "_" בשם המחלקה בלבד מתורגם להפרדת תיקייה גם הוא.
כאשר התו _ נמצא בשם הניימספייס אין לו שום משמעות נוספת. הדוגמה שלנו:
\phpguide\module1\submodule2\subsub3\Encoder_FFMPEG_HD יהפוך להיות תיקיה בשם C:../phpguide/module1/submodule2/subsub2/Encoder/FFMPEG/....
שימו לב לזה ש-Encoder ו-FFMPEG הם עכשיו שמות של תיקיות שבתוכן יהיה הקובץ HD.php.
6. אל שם הניימספייס המלא עם שם המחלקה מצורפת הסיומת .php כאשר שומרים אותם בקבצים.
כלומר המחלקה \phpguide\module1\submodule2\subsub3\Encoder_FFMPEG_HD תהיה שמורה בקובץ C:../phpguide/module1/submodule2/subsub2/Encoder/FFMPEG/HD.php.
7. האותיות בשמות יכולות להיות רק באנגלית.
גם מספרים וקו תחתון מתקבלים, אבל לא אותיות בצ'רקסית.
דוגמאות
\Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
\Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
יש גם קוד מוכן ל-Autoloader בכתובת הזו.
כמובן שכל זה עוסק בספריות שמיועדות לשימוש של מישהו. איש לא מצפה שכל האתר שלכם יהיה בנוי מניימספייסים, אבל המחלקות שתוכלו להשתמש בהן בפרויקטים אחרים – אכן צריכות לענות לסטנדרטים האלה.
אגב, למי שמשתמש בכל מיני פריימוורקים, רובם כוללים תיקיה בשם vendors שמיועדת בדיוק על מנת להכיל את הקוד של אנשים אחרים שתרצו להוסיף לפרויקט שלכם.
תגובות לכתבה:
אגב, קבוצת ה fig מורכבת ממפתחי פריימוורקים וכלים פופולריים אחרים, ביניהם מפתחי
lithium, phpbb, pear, joomla, droopal, propel, doctrine, cakephp, symphony, zf, ezpublish
ועוד כמה בכמות של נציג אחד לפרוייקט או 23 סה"כ
מי כותב את המדריך הבא על מה זה ניימספייס ? :)
נראה לא נוח בעליל, אבל תודה.
האמת שאני מוצא אותו להרבה יותר נוח מסטנדרטים אחרים. חוץ מזה, הפריימוורק שלך כבר בטח כולל את הסקריפטים לטעינה של דברים כאלה, ככה שלך בתור מפתח נשאר רק לזכור לתת שמות נכונים לניימספייסים שאתה יוצר לשימוש חיצוני
עוד פעם, לא מדובר בזה שאתה עכשיו צריך לכתוב את כל הקוד שלך בצורה הזאת.
מדובר בנתינת שמות נכונים למחלקות ופרויקטים שאתה מפרסם החוצה ורוצה שאנשים אחרים ישתמשו בהם.
התחביר של הניימספסים ב-php הוא די זוועתי למען האמת.
המפתחים הסבירו את זה בכך שתו \ היה התו היחידי הפנוי בשפה :)
אני ממש מאוהב מ namespaces ובניתי מערכת גדולה+
עם זה, וזה נוח בטירוף,
התחביר נהיה קל בהרבה ברגע שמשתמשים ב use
אתה יודע מה אני חושב על רמת האירגון של רוב קוד ה-PHP וזה דחיפה מעולה לכיוון הנכון :).
והקוד בתמונה ~זוועה~, הייתה לי פעם עבודה של הוספת תכונות למערכת עם קוד שנראה מאוד דומה לזה, היה סיוט.
זה רק חלק מהתקן, ההמשך פה: https://github.com/php-fig/fig-standards/tree/master/accepted